<?php
declare (strict_types=1);

namespace app\common\tool\Image;

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Logo\Logo;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\Writer\PngWriter;
use app\common\tool\Image\Exception\ImageException;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;

class Image
{
    /**
     * @param $data - 二维码内容
     * @param $name - 二维码名称
     * @param $savePath - 保存路径
     * @param $size - 二维码大小，默认300
     * @return string
     * @throws ImageException
     * 原点 2022年12月9日15:26:25 生成二维码
     */
    public function qrCode($data, $name, $savePath, $size = 300, $logo = '', $repeat = true): string
    {
        try {
            $path = $savePath . '/' . $name . '.png';
            if (file_exists('.' . $path) && $repeat) return $path;
            $writer = new PngWriter();
            $qrCode = QrCode::create($data)
                ->setEncoding(new Encoding('UTF-8'))
                ->setErrorCorrectionLevel(new ErrorCorrectionLevelHigh())
                ->setSize($size)
                ->setMargin(8)
                ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin());
            if (!is_dir('./' . $savePath)) {
                mkdir(iconv("UTF-8", "GBK", './' . $savePath), 0777, true);
            }
            if ($logo) {
                $logoClass = Logo::create('.' . $logo)
                    ->setResizeToWidth(50);
                $result = $writer->write($qrCode, $logoClass);
            } else {
                $result = $writer->write($qrCode);
            }
            $result->saveToFile('.' . $path);
            return $path;
        } catch (\Exception $e) {
            throw new ImageException('加载失败：' . $e->getMessage(), -1);
        }

    }

    /**
     * @param $mainImg - 背景图
     * @param $otherImg - 要合并的图
     * @param $name - 合并后的图片名称
     * @param $savePath - 合并后的图片保存路径
     * @param $x - 要合并图在背景图的x轴位置
     * @param $y - 要合并图在背景图的y轴位置
     * @return string
     * @throws ImageException
     * 原点 2022年12月9日15:35:17 合并图片
     */
    public function merge($mainImg, $otherImg, $name, $savePath, $x = 100, $y = 100)
    {
        try {
            $path = $savePath . '/' . $name;
            $image = \think\Image::open('.' . $mainImg);
            $image->water('.' . $otherImg, [$x, $y])->save('./' . $path);
            return $path;
        } catch (\Exception $e) {
            throw new ImageException('加载失败：' . $e->getMessage(), -1);
        }
    }


    /**
     * @param $data
     * @param $name
     * @param $savePath
     * @param $mainImg
     * @param $x
     * @param $y
     * @param $size
     * @param $logo
     * @return string
     * @throws ImageException
     * 原点 2022年12月10日09:33:40 生成带背景的二维码
     */
    public function qrCodeBackground($data, $name, $savePath, $mainImg, $x = 100, $y = 100, $size = 300, $logo = '')
    {
        try {
            $path = $this->qrCode($data, $name, $savePath, $size, $logo, false);
            return $this->merge($mainImg, $path, $name, $savePath, $x, $y);
        } catch (\Exception $e) {
            throw new ImageException('加载失败：' . $e->getMessage(), -1);
        }
    }

}